package com.oneday.ashop.core.entity;

import com.oneday.ashop.core.base.mongo.BaseMongoDaoSupport;
import org.springframework.data.annotation.Id;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 * 自增实体
 * Created by bo on 2015/7/12.
 */

public  abstract class IncIdEntity<T extends Number>  implements Serializable {

    @Id
    private T id;

    /**
     * 在构造方法中获得T类型参数的实际类型
     */
    @SuppressWarnings("unchecked")
    public IncIdEntity() {
        //获得带有泛型的父类
        //Type是 Java 编程语言中所有类型的公共高级接口。它们包括原始类型、参数化类型、数组类型、类型变量和基本类型。
        Type genType = getClass().getGenericSuperclass();
        //ParameterizedType参数化类型，即泛型
        //getActualTypeArguments获取参数化类型的数组，泛型可能有多个
        Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
        String className = getClass().getName();
        BaseMongoDaoSupport.classIdCache.put(className.substring(className.lastIndexOf(".")), params[0].toString());
    }

    public T getId() {
        return id;
    }

    public void setId(T id) {
        this.id = id;
    }
}
